from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.status import *

from demo.models import Student, Classes
from demo.serializers import StudentSerializer, ClassesSerializer

'''
接口是要继承 ViewSet视图集类
有4种请求方式
    get()       向服务器请求资源
    post()      向服务器提交资源
    PUT()       更新或替换服务器上的资源
    DELETE()    删除服务器上的资源(逻辑删除)

5种实际请求方式
    list()      提供一组数据
    retrieve()  提供单个数据
    create()    创建数据
    update()    修改数据
    destroy()   删除数据
'''


# class StudentViewSet(viewsets.ViewSet):
#     def list(self,request):
#         student = Student.objects.filter(is_delete=False)
#         # 把模型对象结果集 转换成json格式的数据[]{}
#         # 初始化函数的第一个参数是 instance是一个实例
#         # instance 通常由后端提交到前端
#         serializer = StudentSerializer(student, many=True)
#         # print(serializer.data, type(serializer.data))
#         return Response(serializer.data)
#
#     def create(self,request):
#         # 前端的数据，直接默认传会传递给instance 所以需要指定参数传值
#         # 这里是进行JSON(data)转实例化对象的操作，要把参数提交到第2个参数
#         # 这里还调用了serializers的create方法 需要会自定义的serializer类里重写create方法
#         serializer = StudentSerializer(data=request.data)
#         # 对数据进行校验 如果校验没有通过会发生异常信息，
#         serializer.is_valid(raise_exception=True)
#         # 持久化数据 保存数据
#         serializer.save()
#         # 迭代调用了serializers的create
#         return Response(serializer.data)
#
#     def retrieve(self,request,pk):
#         # 通过pk 来查学生
#         try:
#             # 根据id查询到的学生对象
#             student = Student.objects.filter(is_delete=False).get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         # 由后端提交给序列化器转换数据
#         serializer = StudentSerializer(student)
#         print(serializer.data)
#         # 把转换后的数据响应给前端
#         return Response(serializer.data)
#
#     def update(self, request, pk):
#         try:
#             # 根据id查询到的学生对象
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         # 得到用户修改后的值，前端传递过来的数据，我们查询到的数据库里面的数据
#         serializer = StudentSerializer(student, data=request.data)
#         # 校验数据
#         serializer.is_valid()
#         # 修改 持久化数据
#         serializer.save()  # update 方法
#         # 迭代调用了serializers的update
#         return Response(serializer.data)
#
#     def destroy(self,request,pk):
#         try:
#             # 根据id查询到的学生对象
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         # 删除 并不是想要把学生数据删除 而是隐藏
#         # 迭代调用了models的delete
#         student.delete()
#         # 请求是成功 但是没有内容
#         return Response(status=HTTP_204_NO_CONTENT)

class StudentViewSet(viewsets.ModelViewSet):
    # 指定增删改查的数据集
    queryset = Student.objects.filter(is_delete=False)
    # 指定序列化器类
    serializer_class = StudentSerializer


class ClassesViewSet(viewsets.ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = ClassesSerializer

    # 返回最后的班级 detail这个属性代表着需不需要跟参数
    # api代理路由 会这样设计 GET : /classes/last
    # 给我们自定义的方式生成路由
    # 修饰器 action修饰的会自动添加为上面那种格式的路由
    @action(methods=['get'],detail=False)
    def last(self,request):
        classes = Classes.objects.last()
        # 等效于这种写法 ClassesSerializer(data)
        # self.get_serializer是调用本类的序列化器
        data = self.get_serializer(classes).data
        return Response(data)

    # 获取指定班级的最后一个学生
    # pk 是班级的id
    # api设计： GET classes/<pk>/student/last
    # 修改路由 把方法名路由修改为自定义路由
    @action(methods=['get'], detail=True,url_path="student/last")
    def last_student(self,request,pk):
        try:
            classes = Classes.objects.get(id=pk)
        except Classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        # 获取指定班级的最后一个学生
        classes_student_set = classes.student_set.last()
        data = StudentSerializer(classes_student_set).data
        return Response(data)


